package com.srmt.document.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 表格数据传输对象
 * 
 * @author YourCompany
 * @since 1.0.0
 */
public class TableData implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 表格行数据列表
     */
    private List<RowData> rows;
    
    /**
     * 表格行数
     */
    private int rowCount;
    
    /**
     * 表格列数
     */
    private int columnCount;

    // 构造函数
    public TableData() {
        this.rows = new ArrayList<>();
        this.rowCount = 0;
        this.columnCount = 0;
    }
    
    public TableData(List<RowData> rows) {
        this.rows = rows != null ? new ArrayList<>(rows) : new ArrayList<>();
        this.rowCount = this.rows.size();
        this.columnCount = this.rows.isEmpty() ? 0 : this.rows.get(0).getCells().size();
    }
    
    // 便利方法
    
    /**
     * 获取指定位置的单元格内容
     * 
     * @param row 行索引（从0开始）
     * @param column 列索引（从0开始）
     * @return 单元格内容，如果越界返回null
     */
    public String getCell(int row, int column) {
        if (row >= 0 && row < rows.size()) {
            List<String> cells = rows.get(row).getCells();
            if (column >= 0 && column < cells.size()) {
                return cells.get(column);
            }
        }
        return null;
    }
    
    /**
     * 设置指定位置的单元格内容
     * 
     * @param row 行索引
     * @param column 列索引
     * @param value 单元格值
     */
    public void setCell(int row, int column, String value) {
        if (row >= 0 && row < rows.size()) {
            List<String> cells = rows.get(row).getCells();
            if (column >= 0 && column < cells.size()) {
                cells.set(column, value);
            }
        }
    }
    
    /**
     * 添加一行数据
     * 
     * @param rowData 行数据
     */
    public void addRow(RowData rowData) {
        if (rowData != null) {
            rows.add(rowData);
            rowCount = rows.size();
            if (columnCount == 0 && !rowData.getCells().isEmpty()) {
                columnCount = rowData.getCells().size();
            }
        }
    }
    
    /**
     * 在指定位置插入一行
     * 
     * @param index 插入位置
     * @param rowData 行数据
     */
    public void insertRow(int index, RowData rowData) {
        if (rowData != null && index >= 0 && index <= rows.size()) {
            rows.add(index, rowData);
            rowCount = rows.size();
        }
    }
    
    /**
     * 删除指定行
     * 
     * @param index 行索引
     */
    public void removeRow(int index) {
        if (index >= 0 && index < rows.size()) {
            rows.remove(index);
            rowCount = rows.size();
        }
    }
    
    /**
     * 获取指定行
     * 
     * @param index 行索引
     * @return 行数据
     */
    public RowData getRow(int index) {
        if (index >= 0 && index < rows.size()) {
            return rows.get(index);
        }
        return null;
    }
    
    /**
     * 获取指定列的所有数据
     * 
     * @param columnIndex 列索引
     * @return 列数据
     */
    public ColumnData getColumn(int columnIndex) {
        List<String> columnCells = new ArrayList<>();
        for (RowData row : rows) {
            if (columnIndex < row.getCells().size()) {
                columnCells.add(row.getCells().get(columnIndex));
            } else {
                columnCells.add("");
            }
        }
        return new ColumnData(columnCells);
    }
    
    /**
     * 转换为二维数组
     * 
     * @return 二维字符串数组
     */
    public String[][] toArray() {
        String[][] array = new String[rowCount][columnCount];
        for (int i = 0; i < rowCount; i++) {
            List<String> cells = rows.get(i).getCells();
            for (int j = 0; j < columnCount; j++) {
                if (j < cells.size()) {
                    array[i][j] = cells.get(j);
                } else {
                    array[i][j] = "";
                }
            }
        }
        return array;
    }
    
    /**
     * 设置表格数据（从二维列表）
     * 
     * @param rowsData 二维列表数据
     */
    public void setRowsFromLists(List<List<String>> rowsData) {
        List<RowData> newRows = new ArrayList<>();
        for (List<String> row : rowsData) {
            newRows.add(new RowData(row));
        }
        setRows(newRows);
    }
    
    // Getters and Setters
    public List<RowData> getRows() {
        return rows;
    }
    
    public void setRows(List<RowData> rows) {
        this.rows = rows != null ? new ArrayList<>(rows) : new ArrayList<>();
        this.rowCount = this.rows.size();
        this.columnCount = this.rows.isEmpty() ? 0 : this.rows.get(0).getCells().size();
    }
    
    public int getRowCount() {
        return rowCount;
    }
    
    public int getColumnCount() {
        return columnCount;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TableData tableData = (TableData) o;
        return rowCount == tableData.rowCount &&
                columnCount == tableData.columnCount &&
                Objects.equals(rows, tableData.rows);
    }

    @Override
    public int hashCode() {
        return Objects.hash(rows, rowCount, columnCount);
    }

    @Override
    public String toString() {
        return "TableData{" +
                "rowCount=" + rowCount +
                ", columnCount=" + columnCount +
                '}';
    }
}